home *** CD-ROM | disk | FTP | other *** search
/ Merciful 4 / Merciful - Disc 4.iso / software / p / psychotoads.dms / psychotoads.adf / a90 < prev    next >
Text File  |  1989-03-31  |  63KB  |  1,751 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.                            9:MATHS FUNCTIONS                               111
  9.                        -------------------------
  10. AMOS Basic includes a wide variety of the more commonly needed
  11. mathematical functions. To conserve memory, AMOS uses the standard
  12. Amiga library routines. The appropriate libraries will be loaded
  13. automatically from your workbench disc the first time you call one of
  14. these functions in a particular session. You should therefore ensure
  15. that the current disc contains the file MATHTRANS.LIBRARY in the LIBS
  16. folder.
  17.  
  18.  
  19. Trigonometric functions
  20. =======================
  21. The trigonometric functions provide you with a useful array of
  22. mathematical tools. These can be used for a variety of purposes, from
  23. education to the creation of complex musical wabeforms.
  24.  
  25.  
  26.  
  27.                          DEGREE (use degrees)
  28.  
  29. DEGREE
  30.  
  31. Generally all angles are specified in radians. Since radians are rather
  32. difficult to work with, it's possible to instruct AMOS to accept angles
  33. in degrees. Once you've activated this feature any subsequent calls to
  34. the trig functions will expect you to use degrees.
  35.  
  36.  
  37.  
  38.                       RADIAN (use radian measure)
  39.  
  40. RADIAN
  41.  
  42. THe RADIAN directive informs AMOS that all future angles are to be
  43. entered using radians - this is the default.
  44.  
  45.  
  46.  
  47.                          =PI# (a constant PI)
  48.  
  49. a#=PI#
  50.  
  51. This function returns the number called PI which represents the result
  52. of the division of the diameter of a circle by the circumference. PI is
  53. used by most of the trigonometric functions to calculate angels. Note
  54. that a # character is part of the token name! This is to avoid clashes
  55. with your own variable names.
  56.  
  57.  
  58.  
  59.                               =SIN (sine)
  60.  
  61. s#=SIN(a)
  62. s#=SIN(a#)
  63.  
  64. The SIN functions calculates the sine of the angle in n. Note that the
  65. function always returns a floating point number.
  66.  
  67.  
  68.  
  69.                              =COS (cosine)                                 112
  70. c#=COS(a[#])
  71.  
  72. The cosine function computes the cosine of an angle.
  73.  
  74.  
  75.  
  76.                             =TAN (tangent)
  77.  
  78. t#=TAN(a[#])
  79.  
  80. TAN generates the tangent of an angle.
  81.  
  82.  
  83.  
  84.                             =ACOS (arc cos)
  85.  
  86. c#=ACOS(n#)
  87.  
  88. The ACOS function takes a number between -1 and +1 and calculates the
  89. angle which would be needed to generate this value with COS.
  90.  
  91. Note, we haven't provided you with ASIN, because it's not really
  92. needed. It can be readily computed using the formula:
  93.  
  94. ASIN(X)=90-ACOS(X) : Rem Measured in degrees.
  95. ASIN(X)=1.5708-ACOS(X) : Rem using radians
  96.  
  97.  
  98.  
  99.                           =ATAN (arc tangent)                              113
  100.  
  101. t#=ATAN(n#)
  102.  
  103. ATAN returns the arctan of a number.
  104.  
  105.  
  106.  
  107.                         =HSIN (hyperbolic sine)
  108.  
  109. s#=HSIN(a[#])
  110.  
  111. HSIN computes the hyperbolic sine of angle a.
  112.  
  113.  
  114.  
  115.                        =HCOS (hyperbolic cosine)
  116.  
  117. c#=HCOS(a[#])
  118.  
  119. HCOS calculates the hyperbolic cosine of angle a.
  120.  
  121.  
  122.  
  123.                       =HTAN (hyperbolic tangent)
  124.  
  125. t#=HTAN(a[#])
  126.  
  127. HTAN returns the hyperbolic tangent of the angle a.
  128.  
  129.  
  130. Standard mathematical functions                                            114
  131. ===============================
  132.  
  133.  
  134.                            =LOG (logarithm)
  135.  
  136. r#=LOG(v[#])
  137.  
  138. LOG returns the logarithm in base 10 (log 10) of the expression in v#.
  139.  
  140.  
  141.  
  142.                       =EXP (exponential function)
  143.  
  144. r#=EXP(e#)
  145.  
  146. Calculates the exponential of e#. Example:
  147.  
  148.         Print Exp(1)
  149. ( result : 2.71828 )
  150.  
  151.  
  152.                         =LN (natural logarithm)
  153.  
  154. r#=LN(l#)
  155.  
  156. LN computes the natural of naperian logarithm of l#.
  157.  
  158.  
  159.  
  160.                           =SQR (square root)
  161.  
  162. s#=SQR(v[#])
  163.  
  164. SQR calculates the square root of a number.
  165.  
  166.  
  167.  
  168.                          =ABS (absolute value)                             115
  169.  
  170. r=ABS(v[#])
  171.  
  172. ABS returns the absolute value of v, taking no account of its sign.
  173.  
  174.  
  175.  
  176.           =INT (convert floating point number to an integer)
  177.  
  178. i=INT(v#)
  179.  
  180. INT rounds a floating point number in v down to the nearest whole
  181. integer.
  182.  
  183.  
  184.                    =SGN (find the sign of a number)
  185.  
  186. s=SGN(v[#])
  187.  
  188. SGN returns a value of representing the sign of a number. There are
  189. three possibilities.
  190.  
  191.         -1, if v is negative
  192.          0, if v is zero
  193.          1, if v is positive
  194.  
  195.  
  196. Creating random sequences
  197. =========================
  198.  
  199.  
  200.                     =RND (random number generation)
  201.  
  202. RND generates a random integer between 0 and n inclusive. But if n is
  203. less than zero, RND will return the last value it produced. This can be
  204. very useful when debugging one of your programs.
  205.  
  206.  
  207.  
  208.               RANDOMIZE (set the seed of a random number)                  116
  209.  
  210. RANDOMIZE seed
  211.  
  212. In practice, the numbers produced by the RND function are not really
  213. random. They're computed internally using a complex mathematical
  214. formula. The starting point for this calculation is taken from a number
  215. known as the "seed". This seed is set to a standard value whenever you
  216. load AMOS Basic into the computer. So the sequence of numbers generated
  217. by RND will be exactly the same every time you run your game!
  218.  
  219.   The RANDOMIZE command allows you to set the seed value directly, so
  220. that the numbers would really look like random every time.
  221.  
  222.   "seed" can be any value you wish. In order to generate a true random
  223. numbers, you need some way of varying the seed from game to game. This
  224. can be achieved using the TIMER instruction:
  225.  
  226.         Randomize Timer
  227.  
  228. TIMER is a Basic function which returns the amount of time which has
  229. elapsed since your Amiga was switched on in the current session. All
  230. timings are measured in units of a 50th of a second.
  231.  
  232.  
  233. Manipulating numbers
  234. ====================
  235.  
  236.  
  237.                  =MAX (get the maximum of two values)
  238.  
  239. r=MAX(x,y)
  240. r#=MAX(x#,y#)
  241. r$=MAX(x$,y$)    MAX compares two expressions and returns the largest.
  242.                  These expressions can be composed of numbers or
  243. strings of characters, providing you don't try to mix different types
  244. of expressions in one instruction.
  245.  
  246.         Print Max(10,4)
  247. ( result : 10 )
  248.  
  249.  
  250.                 =MIN (return the minimum of two values)                    117
  251.  
  252. r=MIN(x,y)
  253. r#=MIN(x#,y#)
  254. r$=MIN(x$,y$)    This works the same way the =MAX does, except returns
  255.                  the minimum value of compared numbers/strings.
  256.  
  257.  
  258.  
  259.                SWAP (swap the contents of two variables)
  260.  
  261. SWAP x,y
  262. SWAP x#,y#
  263. SWAP x$,y$       Swaps the data between any two variables of the same
  264.                  type.
  265.  
  266.  
  267.  
  268.              FIX (set precision of floating point output)
  269.  
  270. FIX(n)
  271.  
  272. Changes the way your floating point numbers will be displayed on the
  273. screen or printer. There are four possibilities.
  274.  
  275. If 0<n<16 then n denotes the number of figures to be output after
  276.           the decimal point.
  277. If n> 16  the printout will be proportional and any trailing zeros will
  278.           be removed.
  279. If n<0    Then all floating point numbers will be displayed in
  280.           exponential format, and the absolute value of n will
  281.           determine the number of digits after the decimal point.
  282.  
  283. If n=16   then the format will be returned to normal
  284.  
  285.         Fix(-4) : Print PI#
  286.  
  287.  
  288.  
  289.                 DEF FN (create a user-defined function)                    118
  290.  
  291. DEF FN name [(list)]=expression
  292.  
  293. The DEF FN command lets you create your own user-defined functions
  294. within an AMOS Basic program. These can be used to compute commonly
  295. needed values quickly and easily.
  296.  
  297.   "nane" is the name of the function you wish to define. "list" is a
  298. set of variables separated by commas. Only the type of these variables
  299. is significant. When you call your function, any variables you enter
  300. with, will be automatically subsituted in the appropriate positions.
  301.  
  302.   "expression" can include any of the standard AMOS functions you wish.
  303. Like all Basic expressions, it's limited just to a single line of prog.
  304.  
  305.  
  306.  
  307.                   FN (call a user-defined function) 
  308.  
  309. FN name [(variable list)]
  310.  
  311. FN executes a function defined using DEF FN. Example:
  312.  
  313.         Def Fn Asin(X)=90-Acos(X)
  314.         Degree
  315.         Print Fn Asin(0.5)
  316.  
  317.  
  318.  
  319.  
  320.                               10:SCREENS                                   119
  321.                        -------------------------
  322.  
  323. The default screen
  324. ==================
  325. Whenever you run an AMOS Basic program a default screen is created as
  326. screen zero. This forms a standard display which will be used for all
  327. your normal drawing operations.
  328.  
  329.   The system defaults to a 16-colour screen with dimensions 320x200,
  330. which can easily be altered from within your program. In addition, you
  331. can also define up to seven further screen with power SCREEN OPEN
  332. command.
  333.  
  334.  
  335. Defining a screen
  336. =================
  337.  
  338.  
  339.                       SCREEN OPEN (open a screen)
  340.  
  341. SCREEN OPEN n, w, h, nc, mode
  342.  
  343. SCREEN OPEN opens a screen, and reserves some memory it. The new screen
  344. will now be used as the destination of all subsequent text and
  345. graphical operations in your program.
  346.  
  347.   n is the identification number of the screen which is to be created
  348. by this instruction. Possible values range from 0-7. If this screen
  349. already exists, it will be totally replaced by your new definition.
  350.  
  351.   w holds the width of the screen in pixels. This is not limited to the
  352. physical size of your display. It's perfectly lefal to define extra
  353. large screens which may be manupulated using SCREEN OFFSET.
  354.  
  355.   h sets the height of your screen using the same system. Providing
  356. you've enough memory, you can easily create screens which are much
  357. larger than the visible screen area. These screens can be used in
  358. conjunction with all the normal screen operations. So you can construct
  359. your images off-screen, and scroll them into view with the SCREEN
  360. OFFSET command.
  361.  
  362.   nc requests the number of colours required for the new screen. The
  363. range of available colours varies from 2 to 64 (EHB). You can also
  364. access the Amiga's special HAM mode with a value of 4096.
  365.  
  366.   "mode" allows you to choose the width of the individual points on the
  367. screen. The Amiga supports screen widths of either 320 or 640 pixels.
  368. You can select the required width by setting "mode" either LOWRES (0)
  369. or HIRES ($8000).
  370.  
  371.   Here's a list of the possible screen options along with an indication
  372. of the amount of memory they consume.
  373.  
  374.         Colours Resolution   Memory Notes                                  120
  375.         ------- -----------  ------ ------------------------------
  376.            2     320 x 200     8 k  Paper=0 Pen=1 Crsr=1, no flash
  377.                  640 x 200    16 k     "      "      "      "
  378.            4     320 x 200    16 k  Paper=1 Pen=2 Crsr=3, flash=3
  379.                  640 x 200    32 k     "      "      "      "
  380.            8     320 x 200    24 k     "      "      "      "
  381.                  640 x 200    48 k     "      "      "      "
  382.           16     320 x 200    32 k  This is a default screen 0
  383.                  640 x 200    64 k 
  384.           32     320 x 200    40 k
  385.           64     320 x 200    48 k  Extra Half-Bright mode (EHB)
  386.          4096    320 x 200    48 k   Hold and Modify mode  (HAM)
  387.  
  388. Note that the memory sizes in the table only apply to a standard
  389. screen. If you create taller of wider screens, the amount of memory is
  390. consumed will obviously be considerable greater. Screen zero is
  391. equivalent to:
  392.  
  393.         SCREEN OPEN 0,320,200,16,Lowres
  394.  
  395.  
  396.  
  397.                      SCREEN CLOSE (erase a screen)                         121
  398.  
  399.  
  400. SCREEN CLOSE n
  401.  
  402. SCREEN CLOSE deletes screen number n, and frees the memory for use.
  403.  
  404.  
  405.  
  406.                 AUTO VIEW ON/OFF (control viewing mode)
  407.  
  408. AUTO VIEW OFF
  409.  
  410. WHen you open a screen using SCREEN OPEN the new screen is usualyy
  411. displayed immediately. This can be very incovenient during the
  412. initialisation stages of your programs.
  413.  
  414.   The AUTO VIEW OFF command provides you with full control over the
  415. updating process. It turns off the automatic display system copletely.
  416. You can then update the screen display at a convenient point in your
  417. program using the VIEW instruction.
  418.  
  419.   AUTO VIEW ON  activates automatic screen updating.
  420.  
  421.  
  422.  
  423.                  DEFAULT (reset screen to its default)
  424.  
  425. DEFAULT
  426.  
  427. Closes all current open screens and restores the display back to its
  428. original default setting. Example:
  429.  
  430.         Load Iff "AMOS_DATA:IFF/Amospic.IFF",0
  431.         Wait Key
  432.         Defaul
  433.  
  434.  
  435.  
  436.               VIEW (display the current screen settings)
  437.  
  438. VIEW
  439.  
  440. Displays any changes to the current screen settings at the next
  441. vertical blank period. You only have to use this command when AUTOVIEW
  442. is OFF.
  443.  
  444.  
  445. Special screen modes
  446. ====================
  447. The colour of every point on the screen is determined by a value held
  448. in one of the Amiga's 32 colour registers. Each register can be loaded
  449. from a selection of 4096 different colours. 
  450.  
  451.   Although 32 colours may seem rather a lot, particularly by ST
  452. standards, it wasn't enough for the Amiga's designers. The easiest
  453. solution would have been to increase the number of colour registers,
  454. but this was quickly ruled out from reasons of cost.
  455.  
  456.   Instead, they invented two special graphics modes which cleveroly        122
  457. exploited the existing registers to increase the maximum number of
  458. colours on the screen.
  459.  
  460.   You've propably encountered these modes already. They're the infamous
  461. Extra Half Bright and HAM modes. AMOS Basic provides full support for
  462. both HAM and Half Bright modes. Here's a brief explanation.
  463.  
  464.  
  465. Extra Half Bright mode (EHB)
  466. ----------------------------
  467. Doubles the maximum colours on the screen to a grand total of 64. It
  468. works by generating two colours for each of the 32 possible colour
  469. registers. 
  470.  
  471.   The first 32 colours load the colour value directly from one of the
  472. registers. Each register contains a value between 0 and 4095 which sets
  473. the precise shade of the final colour. 
  474.  
  475.   The second group of colours, with numbers from 32 to 63, take one of
  476. the previous registers and divide its contents by two. This produces 32
  477. extra colours which are exactly half as bright as the normal colour
  478. registers.
  479.  
  480.   In order to exploit EHB mode to the full, it's necessary to load the
  481. 32 registers with the brightest shades in your palette. This will
  482. automatically generate a list of intermediate tones in colours 32-63.
  483. Aside from t
  484.  
  485. Hold and Modigy mode (HAM)
  486. --------------------------
  487. The Amiga's hardware currently limits you to a maximum of six bit
  488. planes per screen. This allows you to display up to 64 different
  489. colours on the screen at once. If you wanted to display a photograph       123
  490. though, you'd require hunderds or even thousands of colours on the
  491. screen.
  492.  
  493.   This was the problem faced by Jay Miner when he was designing the
  494. Amiga's display system. His solution was to exploit a trick which has
  495. been known by artists for centuries. If a professional aritst had to
  496. take every conceivable colour on an assignment, he would be faced with
  497. an impossible task. It's therefore common parctice to mix the exact
  498. shade on the spot, out of a small set of basic colours. This provides
  499. millions of potential shades, without the need to carry several large
  500. lorry loads worth of paint. The same technique can also be applied to a
  501. computer screen. Instead of specifying each colour individually, you
  502. can take an existing colour and modify it slightly. This increases the
  503. number of available colours tremendously, and forms the basis of the
  504. Amiga's powerfl Hold And Modify mode.
  505.  
  506.   Each colour value on the Amiga is created from a mixture of the three
  507. separate components. These determine the relative strength of the
  508. primary colours Red, Green and Blue in the final colour. Possible
  509. intenses range from 0 to 15.
  510.  
  511.   Ham mode splits the Amiga's colour values into four separate groups:
  512.  
  513.  * Colour registers 0-15: The first 16 colour take a value directly
  514.                           from a colour register. These colours are
  515.             treadted just like those on a standard 16 colour screen.
  516.  
  517.  * Red components   16-31: However, if a point is set to a colour
  518.                            number in the range 16 to 31, the colour
  519.             value is loaded from the pixel to its immediate left.
  520.             The Red component of this colour is now replaced with a
  521.             value from 0 to 15 which is calculated from the formula:
  522.  
  523.             Intensity=Colour index - 16
  524.  
  525.  * Green components 32-47: Similarly, a colour number from 32 to 47
  526.                            takes the current shade, and changes the 
  527.             green component. The intensity of this component is set
  528.             to a value of colour - 32.
  529.  
  530.  * Blue components  48-63: These colour numbers grab the colour value
  531.                            from the point on the left of the current
  532.             pixel, and load a new blue component from your colour
  533.             number like so: 
  534.  
  535.             Intensity = Colour Index - 48
  536.  
  537. The colour of a particular point therefore depends on the colours of
  538. all the points to the left of it. This allows you to create smooth
  539. gradiations of colour which are ideal for flesh tones. However, you
  540. can't choose the colour of each point on the screen independently. In
  541. practice, it takes a maximum of three pixles to shift from one colour
  542. to another.
  543.  
  544.   When the Amiga was first released, Ham initially was regarded as
  545. little more than curiosity. Nowadays, the situation is very different,
  546. with the advent of excellent Ham graphics packages such as Photon
  547. Paint.
  548.  
  549.   AMOS allows you to perform the full range text and graphics
  550. operations directly on to a Ham screen. EXAMPLE 10.1 provides you with
  551. a simple example of how you can generate an entire screen in just a few
  552. lines of Basic code.
  553.  
  554.   Another point to consider, is that Ham screens are manipulated using
  555. the normal SCREEN DISPLAY and SCREEN OFFSET commands. Here are some
  556. simple guidelines to their use:
  557.  
  558.  * The first point in each horizontal line should be set to a colour
  559.    number from 0 to 15. This will serve as the starting colour for all
  560.    the shades on the current line.
  561.  
  562.  * Don't attempt to subject your Ham screens to horizontal scrolling.
  563.    If you try to scroll one of these screens, you'll get colour fringes
  564.    at the sides of your picture. These are generated by the changes in
  565.    the starting colours for each line. There are no such restrictions
  566.    to vertical scrolling.
  567.  
  568.  * Fringing effects can also be produced by SCREEN COPY. The solution
  569.    is to ensure that the border of your zone is drawn using a colour
  570.    from 0 to 15. This will ensure that your Ham screens will be redrawn    124
  571.    at their new position with their original colours.
  572.  
  573.  
  574. Loading a screen
  575. ================
  576.  
  577.  
  578.               LOAD IFF (load an IFF screen from the disc)
  579.  
  580. LOAD IFF "filename"[,screen]
  581.  
  582. Loads an IFF format picture from the disc. "Screen" indicates the
  583. number of the screen which is to be loaded with your picture. This
  584. screen will be opened automatically for your use, if it didn't exist.
  585. Anything already inside your screen will be totally erased.
  586.  
  587.   To load the picture into the present screen, omit the "screen"
  588. parameter altogether.
  589.  
  590.   Example:
  591.  
  592.   Load Iff "AMOS_DATA:IFF/AMOSPIC.IFF",1
  593.  
  594.  
  595. Saving a screen
  596. ===============
  597.  
  598.  
  599.                      SAVE IFF (save an IFF scree)
  600.  
  601. SAVE IFF "filename"[,compression]
  602.  
  603. Saves the current screen as an IFF picture file on the disc.
  604. "compression" is a flag which allows you to choose whether your file
  605. will be compacted before it's saved. A value of one specifies that the
  606. standard file compressiong system is to be employed and zero saves the
  607. picture as it stands. As a default all AMOS screens are compressed.
  608.  
  609.   SAVE IFF automatically appends a small IFF "chunck" to your picture
  610. file. This stores the present screen settings including SCREEN DISPLAY,
  611. SCREEN OFFSET and SCREEN HIDE/SHOW. When you load this file back into
  612. AMOS Basic it will be returned to exactly its original condition. This
  613. extra IFF data will be completely ignored by external graphics packages
  614. such as DPaint 3.
  615.  
  616.   Note that it's possible to save double buffered or dual playfield
  617. screens with this command.
  618.  
  619.  
  620. Moving a screen                                                            125
  621. ===============
  622.  
  623.  
  624.                   SCREEN DISPLAY (position a screen)
  625.  
  626. SCREEN DISPLAY n [, x, y, w, h]
  627.  
  628. Once you have defined your screen with SCREEN OPEN, you'll need to
  629. position it on your screen. Unlike most other computers, the Amiga is
  630. capable of displaying a picture anywhere you like on the TV screen.
  631. This can be easily exploited to produce amazing "bouncing" screen
  632. effects. With AMOS Basic, it's even possible to perform these
  633. animations using interrupts (see AMAL).
  634.  
  635.   Another aplication is to overlay several screens alongside each
  636. other. This allows you to create your display out of a combination of
  637. different screen modes.
  638.  
  639.   "n" indicates the number of the screen to be positioned. "x" and "y"
  640. specify the location of the screen in hardware coordinates.
  641.  
  642.   The x coordinates of a screen can range from 0 to 448 and are
  643. automatically rounded down to the nearest 16-pixel boundary. Only the
  644. positions between 112 and 448 actually visible on your TV though, and
  645. you are strongly advised to avoid using an x coordinate below 112.
  646.  
  647.   The y coordinates of your screen can range between 0 and 312. The
  648. visible range will largely depend on your TV or monitor, but you'll
  649. propably find that coordinates between 30 and 300 are satisfactory for
  650. the majority of systems.
  651.  
  652.   At the time of writing, there appears to be a minor bug in the
  653. Amiga's HAM mode. These pictures cannot be displayed with a Y
  654. coordinate of exactly 256. So set your coordinates to intermediate
  655. values such as 255 or 257 instead. We're not sure if it's a hardware or
  656. software fault yet but it won't restrict you by any means.
  657.  
  658.   "w" holds the width of your screen in pixels. If this is different
  659. from the original setting, only a part of your image will be shown,
  660. starting from the top left corner of the display. Like the x
  661. coordinates, the screen width will be rounded to the nearest 16 pixel
  662. boundary.
  663.  
  664.   Similarly, "h" sets the apparent height of the screen. Changing this
  665. value will reduce the depth of your image.
  666.  
  667.   Generally SCREEN OPEN will automatically select the display position
  668. for you using a standard setting in the AMOS configuration file. If a
  669. screen is larger than the display then AMOS sets the screen into
  670. overscan.
  671.  
  672.   SCREEN DISPLAY provides you with a simple way of changing these
  673. values from the default. Any of the parameters x,y,h and w may be
  674. omitted as appropriate. The unused values will be automatically
  675. assigned to the default settings, and should be separated by commas.
  676.  
  677.         Screen Display 0,112,45,, : Rem position the screen at 112,45.
  678.  
  679. When you are positioning your screens, try to ensure that the screen
  680. starts at the left of the display and ends towards the right. This is
  681. essential if the Amiga's hardware is to interpret your screen
  682. correctly. In practice, you may need to experiment a little to get the
  683. precise effect you want. Fortunately, the worst that can happen is that
  684. you'll get a silly looking display. The Amiga won't crash if you make a
  685. mistake. here are some guidelines to help you along:
  686.  
  687.  * Only a single screen can be displayed on each horizontal line.          126
  688.    However, you can safely place several screens on top of each other.
  689.    All will be well, providing only one of the screens visible.
  690.  
  691.  * There will always be a one pixel thick "dead zone" between each pair
  692.    of screens. This is generated by the copper list and is completely
  693.    unavoidable. The dead zone will be noticeable whenever you move a 
  694.    sprite between the screens. As an example, try moving the mouse
  695.    pointer from the editor window to the menu line. You should see a 
  696.    small black line through your mouse pointer at the border between
  697.    the two screens.
  698.  
  699.  
  700.  
  701.                        SCREEN OFFSET (hardware scrolling)
  702.  
  703. SCREEN OFFSET n,x,y
  704.  
  705. The Amiga's display is not just limited to the visible dimensios of
  706. your TV screen. There's absolutely nothing stopping you from generating
  707. images which are much larger than the actual screen. It's obviously not
  708. possible to display such pictures in their entirety, but you can easily
  709. view a section of your image using the SCREEN OFFSET command.
  710.  
  711.   "n" is the number of the screen to be displayed. x,y measure the
  712. offset from the top left hand corner of the screen to the starting
  713. point for your display. x and y are specified in units of a single
  714. pixel, so there's nothing stopping you from generating some
  715. delightfully smooth scrolls.
  716.  
  717.   You can also use negative offsets with this instruction, allowing you
  718. to display any part of the Amiga's memory on the screen. See
  719. EXAMPLE 10.2 for a full demonstration of this command.
  720.  
  721.  
  722. Screen control commands                                                    127
  723. =======================
  724.  
  725.  
  726.                      SCREEN CLONE (clone a screen)
  727.  
  728. SCREEN CLONE n
  729.  
  730. The SCREEN CLONE command assigns a second version of the current screen
  731. to screen number n. This clone uses exactly the same memory area as the
  732. original screen.
  733.  
  734.   Normally, the cloned screen is displayed at the same place as its
  735. parent. However it can be manupulated separately using any of the
  736. normal screen operations such as SCREEN DISPLAY and SCREEN OFFSET.
  737.  
  738.   Since there's only a *single* copy of the original screen data in
  739. memory, you can't access a clone with the SCREEN command. You'll get an
  740. "illegal screen parameter" error if you rty. Another point to consider
  741. is that any colour flash sequences you've set up on the original screen
  742. will NOT be copied during the cloning operation. See EXAMPLE 10.3.
  743. Notice the use of the WAIT VBL command. This ensures that the clone is
  744. repositioned off-screen and keeps the movements running smoothly.
  745.  
  746.   If you experiment with SCREEN CLONE, you'll quickly find that there's
  747. a real limit to the amount of movement you can perform without spoiling
  748. the effect completely. Even something as trivial as an extra
  749. calculation to your movement routine can often introduce an
  750. unacceptable delay into your animations.
  751.  
  752.   The screen display can also be adjusted directrly from the AMAL
  753. animation language. This is capable of animating large numbers of
  754. screens smoothly and easily. See EXAMPLE 10.4 for a demonstration.
  755.  
  756.  
  757.  
  758.                   DUAL PLAYFIELD (combine two screens
  759.                          into dual playfield)
  760.  
  761. DUAL PLAYFIELD screen1, screen2
  762.  
  763. The Amiga's dual playfield mode allows you to display two complete
  764. screens simultaneously at the same x and y coordinates. It's almost as
  765. if you'd drawn eaxh screen on cellophane and overlayed them on top of
  766. each other. Each screen can be manipulated totally independently. You
  767. can exploit this to produce a smooth parallax effect which is ideal for
  768. screen scrolling games such as Silkworm.
  769.  
  770.   The two components of a dual playfield are treated just like any
  771. other AMOS screen and can be written to in the normal way. They can
  772. even be animated within AMAL or double buffered.
  773.  
  774.   "screen1" and "screen2" refer to screens which have been previously
  775. defined with the SCREEN OPEN command. Only certain screen combinations
  776. are acceptable. Both screens MUST use the same resolution, as it's
  777. illegal to use hires(meaning actually MedRes) and lowres in the same
  778. playfield.
  779.  
  780. Here is a list of the possibilities                                        128
  781.         Screen 1    Screen 2    Notes
  782.         =============================
  783.         #of colours #of colours
  784.         ----------- -----------
  785.             2           2
  786.             4           2
  787.             4           4
  788.             8           4       LowRes only
  789.             8           8       LowRes only
  790.  
  791. Although the colour ranges are predefined, the sizes of the two screens
  792. can be completely different. By creating a background screen which is
  793. larger than the foreground you can create a delightfully realistic
  794. parallax effect.
  795.  
  796.   The colours of these screens are all taken from the palette of
  797. screen1 with colour zero being treated as transparent.
  798.  
  799.         Screen  Colour indexes (from screen 1)
  800.         ------  ------------------------------
  801.           1       0 - 7
  802.           2       8 - 15
  803.  
  804. When you are drawing to the second screen, AMOS Basic will
  805. automatically convert your colour index to the appropriate number
  806. before using it. So INK 2 will use colour nine from the first palette. 
  807.  
  808.   This conversion process does not apply to the assignment statements
  809. such as COLOUR or PALETTE. It's important to remember this when you are
  810. changing the colour settings, otherwise your new colours will not be
  811. reflected on the actual screen. Always make "screen1" the current
  812. screen before changing your colour assignments.
  813.  
  814. There are a couple of important opints which you must be aware of
  815. before setting up a dual playfield screen:
  816.  
  817.    * The screen offsets for both screens must never be set to zero.
  818.    * If you set a dual playfield screen up and then want to position 
  819.       it with SCREEN OFFSET be sure to specify dual screen 1 not the
  820.       second.
  821.  
  822. DUAL PLAYFIELD is an extremely powerful instruction. A full
  823. demostration can be found in EXAMPLE 10.5.
  824.  
  825.  
  826.  
  827.         DUAL PRIORITY (choose order of dual playfield screens)
  828.  
  829. DUAL PRIORITY screen1,screen2
  830.  
  831. The first screen of a dual playfield is normally displayed directrly
  832. over the second. The DUAL PRIORITY command allows you to change this
  833. order around so that screen2 appears in front if screen1
  834.  
  835.   WARNING! This instruction only changes the order of the display. It
  836. has *NO* effect on the screen organization. The first screen in the
  837. dual playfield list should therefore still be used for all colour
  838. assignments and with SCREEN DISPLAY.
  839.  
  840.  
  841.  
  842.                       SCREEN (set current screen)                          129
  843.  
  844. SCREEN n
  845.  
  846. The SCREEN command allows you to direct all graphical and text
  847. operations to screen number n. 
  848.  
  849.  
  850.  
  851.                   =SCREEN (get the current screen #)
  852.  
  853. s=SCREEN
  854.  
  855. Returns the number of the currently active screen.
  856.  
  857.  
  858.  
  859.           SCREEN TO FRONT (moves screen to front of display)
  860.  
  861. SCREEN TO FRONT [s]
  862.  
  863. This instruction moves screen "s" to the front of the TV display. If
  864. the parameter is omitted, then the current screen will be used instead.
  865.  
  866. Note: if the AUTOVIEW system has been turned off, you'll need to call
  867. the VIEW command before the effect will be visible on the screen.
  868.  
  869.  
  870.  
  871.             SCREEN TO BACK (move screen to back of display)
  872.  
  873. SCREEN TO BACK [n]
  874.  
  875. SCREEN TO BACK moves a screen to the background of your display. If
  876. there is another screen at the same coordinate this will now be
  877. displayed in front of the selected screen.
  878.  
  879.  
  880.  
  881.                 SCREEN HIDE (temporarily hide a screen)
  882.  
  883. SCREEN HIDE [n]
  884.  
  885. Removes a selected screen from view copletely. This screen can be
  886. redisplayed using a call to SCREEN SHOW. If n is omitted, this
  887. instruction will hide the current screen.
  888.  
  889.  
  890.  
  891.                     SCREEN SHOW (restore a screen)                         130
  892.  
  893. SCREEN SHOW [n]
  894.  
  895. Screen SHOW returns a screen onto the display after it has been hidden
  896. with the SCREEN HIDE command.
  897.  
  898.  
  899.  
  900.                =SCREEN HEIGHT (return height of screen)
  901.  
  902. h=SCREEN HEIGHT [n]
  903.  
  904. Returns the height of an AMOS screen. If you don't include the
  905. parameter n, the height will be returned for the current screen.
  906.  
  907.  
  908.  
  909.               =SCREEN WIDTH (return the  width of screen)
  910.  
  911. w=SCREEN WIDTH [n]
  912.  
  913. SCREEN WIDTH retrieves the width of either the current screen or screen
  914. number n. Example:
  915.  
  916.         Print Screen Width
  917.  
  918.  
  919.  
  920.              =SCREEN COLOUR (return the number of colours)
  921.  
  922. c=SCREEN COLOUR
  923.  
  924. Returns the maximum numbers of colours in the currently active screen.
  925.  
  926.  
  927.  
  928.          =SCIN (returns screen number at a selected position)
  929.  
  930. s=SCIN(x,y)
  931.  
  932. Returns the number of screen which is underneath the *hardware*
  933. coordinates x,y. If this screen does not exist, then s will be loaded
  934. with a negative value (null). 
  935.  
  936.   SCIN is normally used in conjuction with the X MOUSE and Y MOUSE
  937. functions to check whether the mouse cursor has entered a particular
  938. screen. Example:
  939.  
  940.         Print Scin(X Mouse, Y Mouse)
  941.  
  942.  
  943. Defining the screen colours                                                131
  944. ===========================
  945.  
  946.  
  947.           DEFAULT PALETTE (load screen with standard palette)
  948.  
  949. DEFAULT PALETTE c1,c2,c3,,,c6,,-> up to 32 colours
  950.  
  951. This command simplifies the process of opening many screens with the
  952. same palette. It defines a list of colours which will be used for all
  953. subsequent screens which you create with the SCREEN OPEN instruction.
  954. As usual, the allowable colour values range from $000 to $FFF. 
  955.  
  956.  
  957.  
  958.               GET PALETTE (set the palette from a screen)
  959.  
  960. GET PALETTE n [,mask]
  961.  
  962. The GET PALETTE instruction copies the colours from screen n and loads
  963. them into the current screen. This can be very useful when you're
  964. moving information from one screen to another with SCREEN COPY, as it's
  965. usually vital that both the source and destination screens share the
  966. same colour settings.
  967.  
  968.   The optional "mask" parameter allows you to load just a selection of
  969. the colours. See GET SPRITE PALETTE for full details of mask.
  970.  
  971.  
  972. Clearing the screen
  973. ===================
  974.  
  975.  
  976.                         CLS (clear the screen)
  977.  
  978. CLS erases all or part of the current screen. There are three possible
  979. formats of this command:
  980.  
  981.         CLS
  982.  
  983. Clears the current screen by filling it with colour zero and clears any
  984. windows which may have been set up.
  985.  
  986.         CLS col
  987.  
  988. Fills your screen with colour col.
  989.  
  990.         CLS col,x1,y1 to x2,y2
  991.  
  992. Replaces the rectangular region at coordinates x1,y1,x2,y2 with a block
  993. of colour col. Col can take any value from 0 to the max. number of
  994. available colours. x1,y1,x2,y2 hold the coordinates for top left and
  995. bottom right corners of the area to be cleared by this command.
  996. Example:
  997.  
  998.         Cls : Circle 100,09,09 : Cls 1,50,50 To 150,150
  999.  
  1000. Manipulating the contents of a screen                                      132
  1001. =====================================
  1002.  
  1003.  
  1004.                SCREEN COPY (copy sections of the screen)
  1005.  
  1006. SCREEN COPY scr1 TO scr2
  1007.  
  1008. SCREEN COPY scr1,x1,y1,x2,y2 TO scr2,x3,y3 [,mode]
  1009.  
  1010. SCREEN COPY makes it possible to copy large sections of a screen from
  1011. one place to another at amazing speed.
  1012.  
  1013.   "scr1" holds the screen used as the source of your image. This can be
  1014. either a standard screen number or the number of a logical or physical
  1015. screen generated using the LOGIC and PHYSIC commands.
  1016.  
  1017.   "scr2" selects an optional destination screen into which this data
  1018. will be copied. If it's omitted, the area will be copied into the
  1019. current screen.
  1020.  
  1021.   x1,y1 and x2,y2 hold the dimensios of a rectangular source area, and
  1022. x3,y3 contain the coordinates of the destination. There are no
  1023. limitions to these coordinates whatsoever. Any parts of your image
  1024. which lie outside the current screen area will be automatically clipped
  1025. as appropriate.
  1026.  
  1027.   The optional "mode" parameter chooses which of the 255 possible
  1028. blitter modes will be used for your copying operation. These modes
  1029. determine how your source and destination areas will be combined
  1030. together on the screen. The mode is set using a bit-pattern in the
  1031. following format:
  1032.  
  1033.         Mode Bit        Source Bit      Destination Bit
  1034.         --------        ----------      ---------------
  1035.            4                0                  0
  1036.            5                0                  1
  1037.            6                1                  0
  1038.            7                1                  1
  1039.  
  1040. Note that the bottom four bits in the pattern are not used by this
  1041. instruction and should always be set to zero. 
  1042.  
  1043.   Each bit in "mode" represents a single combination of bits in the
  1044. source and destination areas. If a mode bit is set to one, then the
  1045. associated bit on the screen will also be loaded with a one, otherwise
  1046. the result will be zero.
  1047.  
  1048.   In order to select the correct drawing mode for you application, you
  1049. simply decide which combinations should result in a one and set the
  1050. appropriate bits in the "mode" parameter accordingly.
  1051.  
  1052.   Supposing you only wanted to set a bit on the screen if both the
  1053. source and destination bits were the same. You would look the table for
  1054. the points where your requirement was satisfied. This would produce the    133
  1055. following vaue for "mode":
  1056.  
  1057.         %10010000
  1058.  
  1059. If you're not familiar with binary notation, you may find this command
  1060. a little opaque. Rather than boring you silly with an explanation of
  1061. binay we'll now provide you with a detailed list of the more common
  1062. requirements along with the associated bit-maps.
  1063.  
  1064.         Mode    Effect                                  Bit-pattern
  1065.         ------- --------------------------------------- -----------
  1066.         REPLACE Replaces the destination with a direct   %11000000
  1067.                 copy of the source image (default).     
  1068.         INVERT  Replaces the destination image by a      %00110000
  1069.                 reversed copy of the source image.
  1070.         AND     Combines the source and destination      %10000000
  1071.                 with a logical AND operation.
  1072.         OR      OR's the source with the destination     %11100000
  1073.                 image.
  1074.         XOR     Combines the source and destination      %01100000
  1075.                 area with an Exclusive OR.
  1076.  
  1077. Technically-minded users should note that SCREEN COPY combines the
  1078. source and destination using blitter areas B and C and that blitter
  1079. area A is not used by the system at all.
  1080.  
  1081.  
  1082.  
  1083. Scrolling the screen
  1084. ====================
  1085.  
  1086.  
  1087.                    DEF SCROLL (define a scroll zone)
  1088.  
  1089. DEF SCROLL n,x1,y1 to x2,y2,dx,dy
  1090.  
  1091. Allows you to define up to 16 different scrolling zones. Each of these
  1092. zones can be associated with a specific scrolling operation which is
  1093. determined by the variables dx and dy.
  1094.  
  1095.   n holds the number of the zone and can range from 1 to 16. x1,y1
  1096. refer to the coordinates of the top left-hand corner of the area to be
  1097. scrolled and x2,y2 to the point diagonally opposite.
  1098.  
  1099.   dx signifies the number of pixels the zone will be shifted to the
  1100. right in each operation. Negative numbers indicate that the scrolling
  1101. will be from right to left, and positive numbers from left to right.
  1102.  
  1103.   Similarly, dy holds the number of pixels the zone will be advanced up
  1104. or down during the scroll. In this case negative values of dy are used
  1105. to indicate an upward movement and positive values a downward motion.
  1106.  
  1107.  
  1108.  
  1109.                       SCROLL (scroll the screen)                           134
  1110.  
  1111. SCROLL n
  1112.  
  1113. The SCROLL command scrolls the screen using the settings you have
  1114. specified with the DEF SCROLL instruction. n refers to the number of
  1115. the zone you wish to scroll.
  1116.  
  1117.         Load Iff "AMOS_DATA:IFF/Frog_Leap.IFF",2
  1118.         Def Scroll 1,0,0, to 320,200,1,0
  1119.         Do
  1120.           Scroll 1
  1121.         Loop
  1122.  
  1123. Larger examples can be found in EXAMPLE 10.7 and EXAMPLE 10.8. The
  1124. variable s holds the number of points the picture will be moved during
  1125. each SCROLL. Note the use of screen switching to improve the quality of
  1126. the motion.
  1127.  
  1128.  
  1129. Screen switching
  1130. ================
  1131.  
  1132. In order to produce the smooth movement effects found in a computer
  1133. game, it's necessery to complete all the drawing operations within a
  1134. time span of no more than a 15th of a second. This represents a real
  1135. challenge for the fastest computer, and it's often impossible to
  1136. achieve even on the Amiga. If the animation is complex, your graphics
  1137. will therefore tend to flicker annoyingly as they are being drawn.
  1138.  
  1139.   Fortunately, there's a solution at hand which has been succesfully
  1140. exploited in the vast majority of modern arcade games. This *screen
  1141. switching* technique can easily generate flicker-free screen animation
  1142. using just a fraction of Amiga's computing power.
  1143.  
  1144.   The basic idea is extremely simple. Instead of constructing your
  1145. images on the actual screen, you perform all your drawing operations on
  1146. a separate logical screen, which is copletely invisible to the user.
  1147. This is distinct from the *physical screen* which is currently being
  1148. displayed on your TV. Once the graphics have been completed, you can
  1149. then swap the logical and physical screen to produce a smooth
  1150. transition between the two screen images. The old physical screen now
  1151. becomes the new logical screen, and is used to construct the next
  1152. picture in your sequence.
  1153.  
  1154.   At fist glance, this process looks pretty complicated, but it's all
  1155. performed automatically by the AMOS Basic DOUBLE BUFFER command. This
  1156. forces all drawing operations to be performed directly on the logical
  1157. screen without affecting the current display. All you need to do within
  1158. your program is to synchronise your drawing operations with the screen
  1159. switches. This can be achieved with the help of SCREEN SWAP
  1160. instruction.
  1161.  
  1162.  
  1163.  
  1164.           SCREEN SWAP (swap the logical and physical screens)
  1165.  
  1166. SCREEN SWAP [n]
  1167.  
  1168. SCREEN SWAP swaps the physical and logical screens. This enables you to
  1169. instananeously switch the physical display between the two screens.        135
  1170.  
  1171.   If you're using DOUBLE BUFFER, these screens will have been created
  1172. for you already. However, you will need to switch off the automatic
  1173. screen switching system with BOB UPDATE OFF, as otherwise the screens
  1174. will be swapped 50 times a second, and will interfere with your own
  1175. drawing operations. It's also necessary to kill the autoback feature
  1176. with AUTOBACK OFF. This normally copies your graphical operatoins onto
  1177. both physical and logical screens. It's useful when you wish to combine
  1178. simple graphics with moving bobs, but it destroys the effect of your
  1179. screen switching operations totally.
  1180.  
  1181.   As an illustration of the power of this command, have a look at the
  1182. programs EXAMPLE 10.9 and EXAMPLE 10.10.
  1183.  
  1184.  
  1185.  
  1186.                 =LOGBASE (return the address of part of
  1187.                       part of the logical screen)
  1188.  
  1189. address=LOGBASE(plane)
  1190.  
  1191. The LOGBASE function is aimed at expert programmers who wish to access
  1192. the Amiga's screen memory directly. "plane" referes one of the six
  1193. possible bit-planes which make up the current screen. After LOGBASE has
  1194. been called, "address" will contain either the address of the required
  1195. bit-plane, or zero if it doesn't exist.
  1196.  
  1197.  
  1198.  
  1199.                    =PHYSBASE (return the address of
  1200.                           the current screen)
  1201.  
  1202. address=PHYBASE
  1203.  
  1204. PHYBASE returns the address in memory of bit-plane number "plane" for
  1205. the current screen. If this plane does not exist, then a value of zero
  1206. will be returned by this function. Example:
  1207.  
  1208.         Loke Phybase(0),0 : Rem pokes a thin line directly onto the 
  1209.                                 screen.
  1210.  
  1211.  
  1212.  
  1213.                      =PHYSIC (return identifier of
  1214.                          the physical screen)
  1215. =PHYSIC
  1216. =PHYSIC(s)
  1217.  
  1218. The PHYSIC function returns an identification number for the current
  1219. physical screen. This number allows you to directly access the physical
  1220. image which is being displayed by the double buffering system.
  1221.  
  1222.   The result of this function can be substituted for the screen number
  1223. in the ZOOM, APPEAR and SCREEN COPY commands.
  1224.  
  1225.   "s" is the number of an AMOS screen. If it's omitted, then the
  1226. present screen will be used instead. Don NOT confuse with the LOGBASE
  1227. function.
  1228.  
  1229.  
  1230.  
  1231.                      =LOGIC (return identifier of                          136
  1232.                           the logical screen)
  1233. =LOGIC
  1234. =LOGIC(s)
  1235.  
  1236. Returns an identification number of a logical screen. This can be used
  1237. in conjunction with the SCREEN COPY, APPEAR and ZOOM commands to change
  1238. your image off-screen, without affecting the current display.
  1239.  
  1240.  
  1241. Screen synchronisation
  1242. ======================
  1243. Like most home computers the AMIGA uses a memory-mapped display. This
  1244. is a technical term for a concept you are almost certainly already
  1245. familiar with. Put simply, a memory-mapped display is one which uses
  1246. special hardware to convert en image stored in memory into a signal
  1247. which can be displayed to your TV screen. Whenever AMOS Basic accesses
  1248. the scren it does so through the medium of this screen memory.
  1249.  
  1250.   The screen display is updated by the hardware every 50th of a second.
  1251. Once a screen has been drawn, the electron beam turns off and returns
  1252. to the top left of the screen. This process is called the vertical
  1253. blank period VBL. At the same time, AMOS Basic performs a number of
  1254. important tasks, such as moving the sprites and switching the physical
  1255. screen address if it has changed. The actions of instructions such as
  1256. ANIM or SCREEN SWAP will therefore only be fully completed when the
  1257. screen is redrawn.
  1258.  
  1259.   Since a 50th of a second is a quite long time for AMOS Basic, this
  1260. can lead to a serious lack of coordination between your program and the
  1261. screen, which is especially noticeable in tight program loops. The best
  1262. way of avoiding this is difficulty, is to wait until the screen has
  1263. been updated before you execute the next Basic command.
  1264.  
  1265.  
  1266.  
  1267.                  WAIT VBL (wait for a vertical blank)
  1268.  
  1269. The WAIT WBL instruction halts the AMIGA until ne next vertical blank
  1270. period. It is commonly used after either a PUT BOB insturction or a
  1271. SCREEN SWAP
  1272.  
  1273.  
  1274. Special effects
  1275. ===============
  1276.  
  1277.  
  1278.                   APPEAR (fade between two pictures)
  1279.  
  1280. APPEAR source TO destination, effect [,pixels]
  1281.  
  1282. The APPEAR command enables you to produce fancy fades between the
  1283. "source" and "destination" screens. Source and destination are simply
  1284. the numbers of screens you've previously opened using SCREEN OPEN. You
  1285. can also substitute the LOGIC and PHYSIC functions in these positions
  1286. if required.
  1287.  
  1288.   "effect" determines the type of fade which will be produced by this
  1289. insturction. The size of this parameter can vary from 1 to the number
  1290. of pixels in you current screen.
  1291.  
  1292.   "pixels" specifies the number of points which are to affected.
  1293. Normally this value is set to the TOTAL screen area, but you can reduce
  1294. it to fade only a part of the screen. All screens are drawn in strict
  1295. order from the top of the screen to the bottom.
  1296.  
  1297.   The appearance of your fades will naturally vary depending on the
  1298. screen mode you are using. A program is provided in EXAMPLE 10.11  to
  1299. allow you to experiment with the various possibilities.
  1300.  
  1301.  
  1302.  
  1303.                     FADE (blend one or more colours                        137
  1304.                          to new colour values)
  1305.  
  1306. FADE speed [,colour list]
  1307. FADE speed TO screen [,mask]
  1308.  
  1309. The FADE command allows you to smoothly change the entire palette from
  1310. one set of colours to another. This can be used to generate
  1311. professional-looking fade effects for your loading screens.
  1312.  
  1313.   The standard version of the instruction takes the current palette,
  1314. and slowly dissolves the screen colours to zero. Each colour value is
  1315. successively reduced by one until they reach zero. Example:
  1316.  
  1317.         Fade 15 : Wait 225
  1318.  
  1319.   "speed" is the number of vertical blank periods that must occur
  1320. before the next colour change is performed.
  1321.  
  1322.   Since the fadig effects are executed using interrupts, it's best to
  1323. wait until the operation has completely finished before proceeding to
  1324. the nexy Basic instruction. The time taken for the fade WAIT can be
  1325. calculated by the formula:
  1326.  
  1327.         wait value = fade speed * 15
  1328.  
  1329. Fade can be extended to generate a new palette directly from a list of
  1330. colour values.
  1331.  
  1332.         Fade 15,$100,$200,$200,$300
  1333.  
  1334. Any number of colours can be specified in this instruction, up to the
  1335. maximum allowed in the current graphics mode. Like most AMOS commands,
  1336. it's possible to omit selected parameters completely. These colours
  1337. will be totally unaffected fy the FADE command.
  1338.  
  1339.         Fade 15,,$100,$800,$F00
  1340.  
  1341. The most powerful form of FADE smoothly transforms the colours from the
  1342. current screen into a palette taken from an existing screen.
  1343.  
  1344.         Fade speed TO s [,mask]
  1345.  
  1346. The present colours are slowly converted into the palette of screen s.
  1347. It's also possible to load the palette from the sprite bank using the
  1348. same technique. Simply use a negative value for the screen number s.
  1349.  
  1350.   "mask" is a bit-pattern which specifies which colours should be
  1351. loaded. Each colour is associated with a single bit in this pattern
  1352. numbered from 0 to 15. If a bit is set to 1, then the relevant colour
  1353. will be changed. See EXAMPLE 10.12.
  1354.  
  1355.  
  1356.  
  1357.                  FLASH (set flashing colour sequence)                      138
  1358.  
  1359. This command gives you the ability to periodically change the colour
  1360. assigned to any colour index. It does this with an interrupt similar to
  1361. that used by the sprite and the music instructions. The format of the
  1362. flash instruction is:
  1363.  
  1364.         FLASH index,"(colour,delay)(colour,delay)(colour,delay)..."
  1365.  
  1366.   "index" is the number of the colour which is to be animated. Delay is
  1367. set in units of a 50th of a second. 
  1368.  
  1369.   Colour is stored in the standard RGB format (See COLOUR) for mode
  1370. details. The action of FLASH is to take each new colour from the list
  1371. in turn, and then load it into the index for a length of time
  1372. specified by the delay. When the end of this list is reached, the
  1373. entire sequence of colours is repeated from the start. Note that you
  1374. are only allows to use a max. of 16 colour changes in any one FLASH
  1375. instruction. Here is a small example:
  1376.  
  1377.         Flash 1,"(007,10)(000,10)"
  1378.  
  1379. This alternates colour number 1 between blue and black every 10/50th of
  1380. a second. 
  1381.  
  1382.         FLASH OFF
  1383.  
  1384. Turns off the flashing. Note that on start-up, colour number 3 is
  1385. automatically assigned a flash sequence for use by the cursor. It's a
  1386. good idea to turn this off before loading any pictures from the disc.
  1387.  
  1388.  
  1389.  
  1390.                       SHIFT UP (colour rotation)
  1391.  
  1392. SHIFT UP delay,first,last,flag
  1393.  
  1394. The SHIFT UP command rotates the values held in the colour registers
  1395. from the "first" to "last". The "first" colour in the list is copied
  1396. into the second, and the second into the third, and so on, until the
  1397. "last" colour in the series is reached.
  1398.  
  1399.   Each AMOS screen can have its own unique set of colour animations.
  1400. Colour shifts can be used to create amazing hyperspace sequences
  1401. similar to those found in Captain Blood and Elite. Since these
  1402. animations are performed using interrupts, they can be executed while
  1403. your program is running, without affecting it in the slightest.
  1404.  
  1405.   "delay" is the time interval between each stage of the rotation,
  1406. measured in 50ths of a second.
  1407.  
  1408.   "flag" controls the type of rotation. If it's ste to one, the last
  1409. colour index in the list will be copied into the first, and the first
  1410. to the last. So the colours will rotate continuously on the screen.
  1411. When "flag" is set to zero, the contents of the first and last indexes
  1412. will be discarded, and the region between first and last will be
  1413. replaced by a copy of the first colour in the list. For example:
  1414.  
  1415.         SHIFT UP 100,1,15,1
  1416.  
  1417.         SHIFT UP 10,1,15,0
  1418.  
  1419.  
  1420.  
  1421.                      SHIFT DOWN (colour rotation)                          139
  1422.  
  1423. This is similar to the SHIFT UP, except it rotates the colours in the
  1424. opposite direction.
  1425.  
  1426.  
  1427.  
  1428.          SHIFT OFF (stops col.rotation for the current screen)
  1429.  
  1430. SHIFT OFF
  1431.  
  1432. Immediately terminates all colour rotations produced by the SHIFT UP or
  1433. SHIFT DOWN instructions
  1434.  
  1435.  
  1436.  
  1437.                  SET RAINBOW (define a rainbow effect)
  1438.  
  1439. Defines an attractive rainbow effect which can be subsequently
  1440. displayed using the RAINBOW command. It works by changing the shade of
  1441. a colour according to a series of simple rules.
  1442.  
  1443.   "n" is the number of your rainbow. Possible values range from 0 to 3.
  1444. "colour" is a colour index which will be changed by the instruction.
  1445. This colour can be assigned a different value for each horizonal sreen
  1446. line (or scan line). Note that only colours 0-15 can be manipulated
  1447. using this system.
  1448.  
  1449.   "length" sets the size of table to store your colours. There's one
  1450. entry in this table for each colour value on the screen. The size of
  1451. this table can range from 16 to 54400. If "length" is less than the
  1452. physical height of your rainbow, then the colour pattern will be
  1453. repeated several times on the screen.
  1454.  
  1455.   The r$,g$,b$ command strings, progressibely change the intensities of    140
  1456. the red, green and blue components of your final colour. These values
  1457. are loaded into a special colour table. Each colour in the table
  1458. determines the appearance of a single horizontal scan line on the
  1459. screen.
  1460.  
  1461.   At the start of the rainbow, all the components in your colour are
  1462. initially loaded with a value of zero. This will be changed according
  1463. to the information held in the colour table. 
  1464.  
  1465.   Any command string may be omitted if required, but you'll still have
  1466. to include the quotes and the commas in their expected positions.
  1467.  
  1468.   Each string can contain a whole list of commands. These will be
  1469. cycled continually to produce the final rainbow pattern. The format is:
  1470.  
  1471.         (n,step,count)
  1472.  
  1473. "n" sets the number of lintes to be assigned to a specific colour value
  1474. in the rainbow. Increasing this number will change the height of each
  1475. individual rainbow line.
  1476.  
  1477.   "step" holds a number to be added to the component. This number will
  1478. be used to generate the colour of the succeeding line on the screen. A
  1479. positive step will increase the intensity of colour component, and a
  1480. negative value will reduce it.
  1481.  
  1482.   Whenever a particular component exceeds the maximum of 15, a new
  1483. value will be calculated from the formula:
  1484.  
  1485.         new component = old component Mod 15
  1486.  
  1487. "count" is the number of times the current operation is to be repeated.
  1488. The best way to demonstrate this command is with an example:
  1489.  
  1490.         Set Rainbow 0,1,64,"(8,2,8)","",""
  1491.         Rainbow 0,56,1,255
  1492.         Wait Key
  1493.  
  1494. This creates a new rainbow with number zero using colour index one. As
  1495. you can see, SET RAINBOW only defines your rainbow. In order to display
  1496. it on the screen you need to make use of the RAINBOW command.
  1497.  
  1498.   The rainbow effects first loads your colour with a value of zero.
  1499. Every four scan-lines, the red component will be automatically
  1500. incremented by two. So the contents of colour zero will progressively
  1501. change from $000 to $E00. WHen the component exceeds the maximum of 15,
  1502. its remainder will be calculated, and the colour will be returned to
  1503. its starting point (zero). The pattern will now be repeated down the
  1504. screen.
  1505.  
  1506.   By defining a separate pattern for eaxh of the red, green and blue
  1507. components of your colour, you can easily generate some starling
  1508. patterns on the screen. Since each rainbow only uses a single colour
  1509. index, there's nothing stopping you from creating the same effects
  1510. using just two colour screens. These are ideal from the backgrounds of
  1511. an arcade game, as they consume very little memory. Example:
  1512.  
  1513.         Screen Open 0,320,256,2,Lowres
  1514.         Set Rainbow 0,1,128,"8,1,8)","(8,1,8)",""
  1515.         Rainbow 0,1,30,128
  1516.         Colour 1,0 : Curs Off : Cls 1 : Flash Off
  1517.         Locate 0,2 : Centre "Amos Basic" : Wait Key
  1518.  
  1519. For further demonstration of the superb effects that can be achieved
  1520. with this instruction load up EXAMPLE 10.13.
  1521.  
  1522.   Rainbows can also be animated using a powerful interrupt system. See
  1523. the section on AMAL for more details.
  1524.  
  1525.  
  1526.  
  1527.                    RAINBOW (create a rainbow effect)                       141
  1528.  
  1529. RAINBOW n,base,y,h
  1530.  
  1531. Displays rainbow number n on the screen. If AUTOVIEW is set to OFF, the
  1532. rainbow will only appear when you next call the VIEW command.
  1533.  
  1534.   "base" is an offset in the first colour in the table you created with
  1535. SET RAINBOW. Changing this value will cycle the rainbow on the screen.
  1536.  
  1537.   y holds the vertical position of the rainbow in hardware coordinates.
  1538. The minimum calue for this coordinate is 40. If you attempt to use a
  1539. coordinate below this point, the rainbow will be displayed from line 40
  1540. onwards. 
  1541.  
  1542.   h sets the height of your rainbow scan lines.
  1543.  
  1544.   Rainbows are totally compatible with the AMOS system including bobs
  1545. and sprits. However, don't attempt to rainbow a colour which is
  1546. currently being changed using the FLASH or SHIFT instructions, as this
  1547. will lead to unpredictable screen effects.
  1548.  
  1549.   Note that only a single rainbow effect can be displayed on a
  1550. particular scan line, even if they use different colours on the screen.
  1551.  
  1552.   Normally the rainbow with the highest screen position will be
  1553. displayed first. But if several rainbows start from the same scan line,
  1554. then the rainbow with the lowest identification number will be drawn in
  1555. front of the others.
  1556.  
  1557.  
  1558.  
  1559.                     =RAIN (change the colour of an
  1560.                        individual rainbow line)
  1561. RAIN(n,line)=c
  1562. c=RAIN(n,line)
  1563.  
  1564. This is the most powerful of all the rainbow creation commands, as it
  1565. allows to change the colour of an individual rainbow line to any value
  1566. you like.
  1567.  
  1568.   n is the number of the rainbow you wish to access. "line" is the
  1569. individual scan line to be changed. Example:
  1570.  
  1571.         Curs Off : Centre "Securitate Stinks!"
  1572.         Set Rainbow 1,1,4097,"","",""
  1573.         For Y=0 To 4095
  1574.           Rain(1,Y)=Y
  1575.         Next Y
  1576.         For C=0 to 4095-255
  1577.           Rainbow 1,C,40,255
  1578.         Next C
  1579.         Wait Key
  1580.  
  1581.  
  1582.  
  1583.                 ZOOM (magnify a section of the screen)                     142
  1584.  
  1585. ZOOM source,x1,y1,x2,y2 TO dest,x3,y3,x4,y4
  1586.  
  1587. ZOOM is a simple instruction which allows you to change the size of any
  1588. rectangular region of the screen.
  1589.  
  1590.   "source" is the number of a screen from which your picture will be
  1591. taken. You can also use the LOGIC function to grab your image from the
  1592. appropriate logical screen. The rectangular area to be affected by this
  1593. instruction is entered using the coordinates x1,y1,x2,y2. "dest" holds
  1594. the destination screen for your image. Like the source, it can be
  1595. either a screen number, or a logical screen specified using LOGIC.
  1596.  
  1597.   The dimensios of this screen are taken from the cordinates x3,y3 and
  1598. x4,y4. These hold the dimensios of the rectangle into which the screen
  1599. segment will be compressed.
  1600.  
  1601.   The effect of this instruction depends on the relative sizes of the
  1602. source and destination rectanges. The source image is automatically
  1603. resized to fit exactly into the destination rectangle. So the same
  1604. instruction can be used to reduce or enlarge your images as required.
  1605.  
  1606.   See EXAMPLE 10.14 for a further demonstration.
  1607.  
  1608.  
  1609. Changing the copper list
  1610. ========================
  1611. The Amiga's co-processor (copper) provides total control over the
  1612. appearance of every line on your screen. This copper is a separate
  1613. processor with its own internal memory and unique set of instructions.
  1614. By programming the copper it's possible to freely generate a massive
  1615. variety of different screen effects. Normally the copper is managed
  1616. automatically by the AMOS system. Each of the available copper effects
  1617. can be performed directly from within AMOS Basic without the need to
  1618. indulge in complicated machine-level programming. In practive these
  1619. intructions will be more than sufficient for the vast majority of
  1620. applications.
  1621.  
  1622.   Obviously, no one can think of everything though. Expert programmers
  1623. may wish to access the copper directly to create their own special
  1624. screen modes.
  1625.  
  1626.   Be warned: The copper list is notoriously difficult to program, and
  1627. if you don't know precisely what you are doing, you'll almost certainly
  1628. crash your Amiga. Before embarking on your copper experiments for the
  1629. first time, you are therefore adviced to read one of the many reference
  1630. books on the subject. A good explanation can be found the "Amiga System
  1631. Programmers Guite" from Abacus.
  1632.  
  1633.  
  1634.  
  1635.              COPPER OFF (turn of the standard copper list)                 143
  1636.  
  1637. COPPER OFF
  1638.  
  1639. Freezes the current AMOS copper list and turns off the screen display
  1640. copletely. You can now create your own display using a series of COP
  1641. MOVE and COP WAIT instructions.
  1642.  
  1643.   As a default, all user-defined copper lists are limited to a maximum
  1644. of 12k. On average, each copper instruction takes up two bytes. So
  1645. there's a space for around 6000 instructions. This may be increased if
  1646. required, using a special option from the CONFIG utility.
  1647.  
  1648.   Note that all copper instructions are written to a separate logical
  1649. list which is not displayed on the screen. This stops your program
  1650. corrupting the display while the copper list is being created. To
  1651. activate your new screen, you'll need to swap the physical and logical
  1652. lists around with the COP SWAP command.
  1653.  
  1654.   It's also important to generate your copper lists in strict order,
  1655. starting from the top left of your screen and progressing downward to
  1656. the bottom right. See EXAMPLE 10.15.
  1657.  
  1658.  
  1659.  
  1660.                   COPPER ON (restart the copper list)
  1661.  
  1662. COPPER ON
  1663.  
  1664. Restarts the AMOS copper list calculations and displays the current
  1665. AMOS screens.
  1666.  
  1667.  
  1668.  
  1669.                 COP MOVE (write a MOVE instruction into
  1670.                        the logical copper list)
  1671.  
  1672. COP MOVE addr,value
  1673.  
  1674. Generates a MOVE instruction in the logical copper list.
  1675.  
  1676.   "addr" is an address of a 16 bit register to be changed. This must
  1677. lie within the normal copper DATA ZONE ($7F-$1BE). "value" is a
  1678. word-sized integer to be loaded into the requested register.
  1679.  
  1680.  
  1681.  
  1682.                COP MOVEL (write a long MOVE instruction
  1683.                            into copper list)
  1684.  
  1685. COP MOVEL addr,value
  1686.  
  1687. This is identical to the COP MOVE, except that "addr" now refers to a
  1688. 32-bit copper register. "value" contains a long word intereger.
  1689.  
  1690.  
  1691.  
  1692.                   COP WAIT (copper WAIT instruction)
  1693.  
  1694. COP WAIT x,y [,x mask, y mask]
  1695.  
  1696. COP WAIT writes a WAIT instruction into your copper list. The copper
  1697. waits until the hardware coordinates x,y have been reached and returns
  1698. control to the main processor. Note that line 255 is automatically
  1699. managed by AMOS. So you don't have to worry about it at all.
  1700.  
  1701.   x mask and y mask are bit maps which allow you to wait until just a
  1702. certain combination of bits in the screen coordinates have been set. As
  1703. a default both masks are automatically assignet to $1FF.
  1704.  
  1705.  
  1706.  
  1707.                 COP RESET (reset copper list pointers)                     144
  1708.  
  1709. COP RESET
  1710.  
  1711. Restores the address used by the next copper instruction to the start
  1712. of the copper list.
  1713.  
  1714.  
  1715.  
  1716.                   =COP LOGIC (address of copper list)
  1717.  
  1718. addr=COP LOGIC
  1719.  
  1720. This function returns the absolute address in memory of the logical
  1721. copper list. This allows you to poke your COPPER instructions directly
  1722. into the buffer, possibly using assembly language.
  1723.  
  1724.  
  1725. Hints and tips
  1726. ==============
  1727. * Before creating a screen with a user defined copper list, you'll
  1728.   first need to allocate some memory for the appropriate bit-maps.
  1729. Although you can use RESERVE for this purpose, it's much easier to
  1730. define a dummy screen with the SCREEN OPEN command instead. The copper
  1731. registers can be loaded with the addresses of the required bit-maps
  1732. using the LOGBASE function.
  1733.  
  1734.   You'll now be able to access your screen using all the standard AMOS
  1735. drawing features. In order to reserve the correct amount of memory, set
  1736. the number of colours to the MAXIMUM used in the new screen. This may
  1737. be a little wasteful, but simplifies things enormously.
  1738.  
  1739. * It's perfectly acceptable to combine user-defined screens with AMOS
  1740.   bobs. If you're using double buffering though, you'll have to define
  1741. a separate copper list for both the logical and physical screens. This
  1742. may be achieved using the following procedure;
  1743.  
  1744.   1 Define your copper list for the first screen
  1745.   2 Swap the logical and physical copper lists with COP SWAP
  1746.   3 Swap the physical and logical screens with SCREEN SWAP
  1747.   4 Define your copper list for the second screen
  1748.  
  1749. This will ensure that your bobs will updated correctly on your new
  1750. screens. All the normal AMOS commands can be used including AMAL.
  1751.